<?php
namespace x\my;
class Session
{
    /**
     * 前缀
     * @var string
     */
    protected $prefix = '';

    public function prefix($prefix=''){
        $this->prefix = $prefix;
    }

    /**
     * session设置
     * @access public
     * @param  string        $name session名称
     * @param  mixed         $value session值
     * @param  string|null   $prefix 作用域（前缀）
     * @return void
     */
    public function set($name, $value)
    {
        $prefix = $this->prefix;
        if (strpos($name, '.')) {
            // 二维数组赋值
            list($name1, $name2) = explode('.', $name);
            if ($prefix) {
                $_SESSION[$prefix][$name1][$name2] = $value;
            } else {
                $_SESSION[$name1][$name2] = $value;
            }
        } elseif ($prefix) {
            $_SESSION[$prefix][$name] = $value;
        } else {
            $_SESSION[$name] = $value;
        }
    }

    /**
     * session获取
     * @access public
     * @param  string        $name session名称
     * @param  string|null   $prefix 作用域（前缀）
     * @return mixed
     */
    public function get($name)
    {
        $value = $this->prefix ? (!empty($_SESSION[$this->prefix]) ? $_SESSION[$this->prefix] : []) : $_SESSION;
        if ('' != $name) {
            $name = explode('.', $name);
            foreach ($name as $val) {
                if (isset($value[$val])) {
                    $value = $value[$val];
                } else {
                    $value = null;
                    break;
                }
            }
        }
        return $value;
    }

    /**
     * 删除session数据
     * @access public
     * @param  string|array  $name session名称
     * @param  string|null   $prefix 作用域（前缀）
     * @return void
     */
    public function delete($name)
    {
        if (is_array($name)) {
            foreach ($name as $key) {
                $this->delete($key, $this->prefix);
            }
        } elseif (strpos($name, '.')) {
            list($name1, $name2) = explode('.', $name);
            if ($this->prefix) {
                unset($_SESSION[$this->prefix][$name1][$name2]);
            } else {
                unset($_SESSION[$name1][$name2]);
            }
        } else {
            if ($this->prefix) {
                unset($_SESSION[$this->prefix][$name]);
            } else {
                unset($_SESSION[$name]);
            }
        }
    }

    /**
     * 清空session数据
     * @access public
     * @param  string|null   $prefix 作用域（前缀）
     * @return void
     */
    public function clear()
    {
        if ($this->prefix) {
            unset($_SESSION[$this->prefix]);
        } else {
            $_SESSION = [];
        }
    }

    /**
     * 判断session数据
     * @access public
     * @param  string        $name session名称
     * @param  string|null   $prefix
     * @return bool
     */
    public function has($name)
    {
        if (strpos($name, '.')) {
            // 支持数组
            list($name1, $name2) = explode('.', $name);

            return $this->prefix ? isset($_SESSION[$this->prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]);
        } else {
            return $this->prefix ? isset($_SESSION[$this->prefix][$name]) : isset($_SESSION[$name]);
        }
    }

    /**
     * 添加数据到一个session数组
     * @access public
     * @param  string  $key
     * @param  mixed   $value
     * @return void
     */
    public function push($key, $value)
    {
        $array = $this->get($key);

        if (is_null($array)) {
            $array = [];
        }

        $array[] = $value;

        $this->set($key, $array);
    }
}
